GNU Multi-Precision Library
開発元 | GNUプロジェクト |
---|---|
初版 | 1991年 |
最新版 |
6.2.0
/ 2020年1月18日 [1] |
リポジトリ |
gmplib |
プログラミング 言語 | C |
プラットフォーム | クロスプラットフォーム |
種別 | 任意精度演算ライブラリ |
ライセンス | LGPLv3 と GPLv2 のデュアルライセンス |
公式サイト |
gmplib |
GNU Multi-Precision Library(GMP)は、多倍長整数など任意精度の算術ライブラリで、フリーソフトウェアである。符号付き整数、有理数、浮動小数点数を扱う。事実上、動作中のハードウェアが持つメモリ容量以外には精度は制限されない(オペランドの大きさは32ビットマシンでは 231 ビット、64ビットマシンでは 237 ビット[2])。様々な関数があり、それらが一貫したインタフェースで提供されている。基本インタフェースはC言語だが、他の言語用ラッパーを使えば、C++、OCaml、Perl、Pythonなどでも使える。また、Ruby 2.1のように[3]、言語コアに組み込まれている例もある。
GMPの主な用途は暗号(実用と研究)、インターネットセキュリティ、数式処理システムである。
GMPは、どんなオペランドの大きさでも他の多倍長整数ライブラリよりも高速であることを目標としている。このために、以下の点を重視している。
- 基本算術型としてフルワードを使う。
- オペランドの大きさによってそれぞれ異なるアルゴリズムを使う。非常に大きな数に有効なアルゴリズムは、小さい数では遅いことが多い。
- 重要なループには高度に最適化したアセンブリ言語コードを使う。当然、CPUによって異なったものになる。
最初のGMPは1991年にリリースされた。その後継続的に開発と保守が行われている。
公式サイトがgnu.orgにないので混乱する場合があるが、GMPはGNUプロジェクトの一部であり、GNU Lesser General Public License (LGPL) でライセンスされている。
GMPは多くの数式処理システムで整数の算術に使われている。例えばMathematicaがGMPを採用している[4]。
GMPはGCCのビルドに必要である。
コード例
[編集]ここでは、GMPライブラリを使って大きな数字を掛け合わせて表示するC言語のコード例を示す。
#include <stdio.h>
#include <gmp.h>
int main(void) {
mpz_t x, y, result;
mpz_init_set_str(x, "7612058254738945", 10);
mpz_init_set_str(y, "9263591128439081", 10);
mpz_init(result);
mpz_mul(result, x, y);
gmp_printf(" %Zd\n"
"*\n"
" %Zd\n"
"--------------------\n"
"%Zd\n", x, y, result);
/* free used memory */
mpz_clear(x);
mpz_clear(y);
mpz_clear(result);
return 0;
}
このコードは、7612058254738945×9263591128439081の値を計算している。
このプログラムをコンパイルして実行すると、次のような結果が得られる。(Unixタイプのシステムでコンパイルする場合は-lgmp
フラグが使用される)
7612058254738945
*
9263591128439081
--------------------
70514995317761165008628990709545
C++プログラムで同様の内容を書くと次のようになる。(Unixタイプのシステムでコンパイルする場合は-lgmpxx -lgmp
フラグが使用される)
#include <iostream>
#include <gmpxx.h>
int main() {
mpz_class x("7612058254738945");
mpz_class y("9263591128439081");
std::cout << " " << x << "\n"
<< "*\n"
<< " " << y << "\n"
<< "--------------------\n"
<< x * y << "\n";
return 0;
}
言語バインディング
[編集]ライブラリ名 | 言語 | ライセンス |
---|---|---|
GNU Multi-Precision Library | C, C++ | LGPL |
Math::GMP | Perl | LGPL |
Math::GMPz, Math::GMPf and Math::GMPq | Perl | Artistic License v1.0 + GPL v1.0-or-later |
General Multiprecision Python Project | Python | LGPL |
R package 'gmp' | R言語 | GPL |
The RubyGems project | Ruby | Apache 2.0 |
GNU Multi-Precision Library for PHP | PHP | PHP |
GNU Multi-Precision Routines for SBCL | Common Lisp | パブリックドメイン |
Ch GMP | Ch (プログラミング言語) | プロプライエタリ |
Parallel GMP Wrapper for BMDFM | BMDFM LISP / C | パブリックドメイン |
Glasgow Haskell Compiler (The implementation of Integer is basically a binding to GMP) |
Haskell | BSD |
luajit-gmp | LuaJIT | MIT |
gmp-wrapper-for-delphi | Delphi | MIT |
Zarith | OCaml | LGPL |
Math.Gmp.Native Library | .NET | MIT |
nim-gmp | Nim | MIT |
脚注
[編集]- ^ “GMP 6.2 release notes”. 2020年7月18日閲覧。
- ^ Future releases
- ^ GCの変更と高速化を盛り込んだRuby 2.1.0 @IT、2014年1月7日(2015年11月11日閲覧)。
- ^ Numerical computation features for Mathematica 5.0 Rob Knapp